package com.sky.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration  // 标识这是一个配置类，Spring 会扫描并加载其中的 Bean 定义
@Slf4j          // Lombok 注解，自动生成日志对象（log），用于打印日志
public class RedisConfiguration {
    @Bean//@Bean 注解标记的方法，其参数会被 Spring 自动解析并注入
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
        log.info("开始创建redis模板类...");
        RedisTemplate redisTemplate = new RedisTemplate();


        //设置key的序列化器，默认为JdkSerializationRedisSerializer
        //Redis 本质上是一个 “键值对数据库”，但存储的是 二进制数据。当我们用 RedisTemplate 存储 Java 对象时，
        // 需要先将对象 “序列化” 为二进制数据（写入时），读取时再 “反序列化” 为 Java 对象。

        redisTemplate.setKeySerializer(new StringRedisSerializer());

        // Value 用 JSON 序列化（推荐！支持复杂对象，可读性好）
        // 新增：配置支持Java 8时间类型的序列化器
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule()); // 注册LocalDateTime处理模块
        GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);

        redisTemplate.setValueSerializer(jsonSerializer);
        redisTemplate.setHashValueSerializer(jsonSerializer);

        redisTemplate.setConnectionFactory(redisConnectionFactory);//设置连接工厂对象,让 RedisTemplate 知道 “如何连接 Redis 服务器”（通过连接工厂获取连接）。
        return redisTemplate;
    }
    //redisTemplate后面可以直接使用，使用这玩意可以操作五种类型的数据
//    ValueOperations valueOperations = redisTemplate.opsForValue();
//    HashOperations hashOperations = redisTemplate.opsForHash();
//    ListOperations listOperations = redisTemplate.opsForList();
//    SetOperations setOperations = redisTemplate.opsForSet();
//    ZSetOperations zSetOperations = redisTemplate.opsForZSet();

    // 明确指定泛型 <String, Object>
//    @Bean
//    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//        log.info("开始创建redis模板类...");
//        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//
//        // 设置连接工厂
//        redisTemplate.setConnectionFactory(redisConnectionFactory);
//
//        // 设置Key的序列化器（String类型，避免乱码）
//        redisTemplate.setKeySerializer(new StringRedisSerializer());
//        // 设置Value的序列化器（JSON格式，支持Object类型）
//        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
//
//        // 可选：设置Hash类型的Key和Value序列化器
//        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
//        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
//
//        // 初始化参数设置
//        redisTemplate.afterPropertiesSet();
//
//        return redisTemplate;
//    }
}
